/**
 * 
 */
package com.cplsystems.incidencias.vm.panelControl;

import java.io.Serializable;

import org.zkoss.bind.BindUtils;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.GlobalCommand;
import org.zkoss.bind.annotation.Init;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Messagebox;

import com.cplsystems.incidencias.app.utils.IncidenciasConstants;
import com.cplsystems.incidencias.app.utils.IncidenciasUtils;
import com.cplsystems.incidencias.business.Organizacion;
import com.cplsystems.incidencias.business.OrganizacionCategoria;
import com.cplsystems.incidencias.business.OrganizacionTipoPersonal;
import com.cplsystems.incidencias.business.Sucursal;
import com.cplsystems.incidencias.vm.panelControl.utils.PanelControlVariables;

/**
 * @author César Palalía López (csr.plz@aisa-automation.com)
 * 
 */

@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class PanelControlVM extends PanelControlVariables implements
		Serializable {

	private static final long serialVersionUID = -2673573472455683360L;
	private Organizacion organizacion;

	@Init
	public void init() {
		super.init();
		organizacion = (Organizacion) sessionUtils
				.getFromSession(IncidenciasUtils
						.encrypt(IncidenciasConstants.FIRMA));
	}

	@NotifyChange({ "sucursalSeleccionada" })
	@Command
	public void nuevaSucursal() {
		sucursalSeleccionada = new Sucursal();
		sucursalSeleccionada.setOrganizacion(organizacion);
	}

	@Command
	@NotifyChange({ "sucursales", "sucursalSeleccionada" })
	public void guardarSucursal() {
		if (sucursalSeleccionada.getNombre() == null
				|| sucursalSeleccionada.getNombre().isEmpty()) {
			IncidenciasUtils
					.showMessage(
							"Por favor especifique al menos el nombre para la nueva sucursal",
							Clients.NOTIFICATION_TYPE_WARNING, 3500);
			return;
		}
		if (!sucursales.contains(sucursalSeleccionada)) {
			sucursales.add(sucursalSeleccionada);
		}
		sucursalService.save(sucursalSeleccionada);
		sucursalSeleccionada = new Sucursal();
	}

	@Command
	@NotifyChange({ "sucursales", "sucursalSeleccionada" })
	public void removerSucursal() {
		Messagebox.show("¿Está seguro de remover este elemento?, "
				+ "esta acción es irreversible", "Question", Messagebox.OK
				| Messagebox.CANCEL, Messagebox.QUESTION,
				new EventListener<Event>() {
					public void onEvent(Event event) throws Exception {
						if (((Integer) event.getData()).intValue() == Messagebox.OK) {
							if (sucursalSeleccionada.getIdSucursal() != null) {
								sucursales.remove(sucursalSeleccionada);
								sucursalService.delete(sucursalSeleccionada);
								sucursalSeleccionada = new Sucursal();
								BindUtils.postGlobalCommand(null, null,
										"refreshSucursalVariables", null);
							}
						}
					}
				});
	}

	@GlobalCommand
	@NotifyChange({ "sucursales", "sucursalSeleccionada" })
	public void refreshSucursalVariables() {

	}

	@NotifyChange({ "categorias", "nuevaOrganizacionCategoria" })
	@Command
	public void nuevaCategoria() {
		if (nuevaOrganizacionCategoria.getCategoria().getNombre() == null
				|| nuevaOrganizacionCategoria.getCategoria().getNombre()
						.isEmpty()) {
			IncidenciasUtils
					.showMessage(
							"Por favor especifique al menos el nombre para la nueva categoría",
							Clients.NOTIFICATION_TYPE_WARNING, 3500);
			return;
		}
		categorias.add(nuevaOrganizacionCategoria);
		nuevaOrganizacionCategoria = new OrganizacionCategoria();
	}

	@NotifyChange({ "organizacionTipoPersonal", "nuevaOrganizacionTipoPersonal" })
	@Command
	public void nuevoTipoPersonal() {
		if (nuevaOrganizacionTipoPersonal.getTipoPersonal().getNombre() == null
				|| nuevaOrganizacionTipoPersonal.getTipoPersonal().getNombre()
						.isEmpty()) {
			IncidenciasUtils
					.showMessage(
							"Por favor especifique al menos el nombre para el nuevo tipo de personal",
							Clients.NOTIFICATION_TYPE_WARNING, 3500);
			return;
		}
		organizacionTipoPersonal.add(nuevaOrganizacionTipoPersonal);
		nuevaOrganizacionTipoPersonal = new OrganizacionTipoPersonal();
	}

}
